import math


def 求最大值(临时序列):
    assert(isinstance(临时序列, list))
    最大值 = 临时序列[0]
    for 子项 in 临时序列:
        if 子项 > 最大值:
            最大值 = 子项
    return 最大值


def 求最小值(临时序列):
    assert(isinstance(临时序列, list))
    最小值 = 临时序列[0]
    for 子项 in 临时序列:
        if 子项 < 最小值:
            最小值 = 子项
    return 最小值


def 求和(临时序列):
    assert(isinstance(临时序列, list))
    和 = 0.0
    for 子项 in 临时序列:
        和 += 子项
    return 和


def 求平均值(临时序列):
    assert(isinstance(临时序列, list) and len(临时序列) > 0)
    return float(求和(临时序列))/len(临时序列)


def 求中位数(临时序列):
    assert(isinstance(临时序列, list) and len(临时序列) > 0)
    长度 = len(临时序列)
    tmp = 临时序列
    tmp.sort()
    索引 = int(长度/2)
    if 1 == 长度 % 2:
        return tmp[索引]
    else:
        return (tmp[索引 - 1] + tmp[索引])/2


def 全排列(m, n):
    assert(m >= n and isinstance(m, int) and isinstance(n, int))
    结果 = 1
    for i in range(m-n+1, m+1):
        结果 = 结果*i
    return 结果


def 组合(m, n):
    # print("m:%d, n:%d" % (m, n))
    assert(isinstance(n, int) and n >= 0)
    assert(isinstance(m, int) and m >= n)
    res = 1
    tmp1 = 1
    tmp2 = m - n + 1
    for i in range(n):
        res = res*tmp2/tmp1
        tmp1 += 1
        tmp2 += 1
    return int(res)


def 求方差(数组):
    assert(isinstance(数组, list))
    均值 = 求平均值(数组)
    res = 0.0
    for item in 数组:
        res += (item - 均值)**2
    res = res/len(数组)
    return res


def 求标准差(数组):
    方差 = 求方差(数组)
    标准差 = math.sqrt(方差)
    return 标准差


def toHex(val, nbits):
    return hex((val + (1 << nbits)) % (1 << nbits))
